package cn.iocoder.yudao.module.pay.framework;

import cn.iocoder.yudao.module.api.pay.order.dto.UnifiedOrderCreateDTO;
import cn.iocoder.yudao.module.api.pay.order.vo.UnifiedOrderVO;
import cn.iocoder.yudao.module.api.pay.refund.dto.UnifiedRefundCreateDTO;
import cn.iocoder.yudao.module.api.pay.refund.vo.UnifiedRefundVO;
import cn.iocoder.yudao.module.api.pay.transfer.dto.UnifiedTransferCreateDTO;
import cn.iocoder.yudao.module.api.pay.transfer.vo.UnifiedTransferVO;

import java.util.Map;

/**
 * 支付客户端，用于对接各支付渠道的 SDK，实现发起支付、退款等功能
 *
 * @author 芋道源码
 */
public interface PayClient<CONFIG> {

    /**
     * 获得渠道编码
     *
     * @return 渠道编码
     */
    String getChannelCode();

    /**
     * 获得渠道配置
     *
     * @return 渠道配置
     */
    CONFIG getChannelConfig();

    // ============ 支付相关 ==========

    /**
     * 调用支付渠道，统一下单
     *
     * @param dto 下单信息
     * @return 支付订单信息
     */
    UnifiedOrderVO unifiedOrder(UnifiedOrderCreateDTO dto);

    /**
     * 获得支付订单信息
     *
     * @param payNo 统一支付单号
     * @return 支付订单信息
     */
    UnifiedOrderVO getOrder(String payNo);

    /**
     * 解析 order 回调数据
     *
     * @param params HTTP 回调接口 content type 为 application/x-www-form-urlencoded 的所有参数
     * @param body HTTP 回调接口的 request body
     * @param headers HTTP 回调接口的 request headers
     * @return 支付订单信息
     */
    UnifiedOrderVO parseOrderNotify(Map<String, String> params, String body, Map<String, String> headers);

    /**
     * 调用支付渠道，统一关单
     *
     * @param payNo 统一支付单号
     */
    @SuppressWarnings("UnusedReturnValue")
    boolean closeOrder(String payNo);

    // ============ 退款相关 ==========

    /**
     * 调用支付渠道，进行退款
     *
     * @param dto  统一退款请求信息
     * @return 退款信息
     */
    UnifiedRefundVO unifiedRefund(UnifiedRefundCreateDTO dto);

    /**
     * 获得退款订单信息
     *
     * @param payNo 统一支付单号
     * @param refundNo 统一退款单号
     * @return 退款订单信息
     */
    UnifiedRefundVO getRefund(String payNo, String refundNo);

    /**
     * 解析 refund 回调数据
     *
     * @param params HTTP 回调接口 content type 为 application/x-www-form-urlencoded 的所有参数
     * @param body HTTP 回调接口的 request body
     * @param headers HTTP 回调接口的 request headers
     * @return 支付订单信息
     */
    UnifiedRefundVO parseRefundNotify(Map<String, String> params, String body, Map<String, String> headers);

    // ============ 转账相关 ==========

    /**
     * 调用渠道，进行转账
     *
     * @param dto 统一转账请求信息
     * @return 转账信息
     */
    UnifiedTransferVO unifiedTransfer(UnifiedTransferCreateDTO dto);

    /**
     * 获得转账订单信息
     *
     * @param transferNo 统一转账单号
     * @return 转账信息
     */
    UnifiedTransferVO getTransfer(String transferNo);

    /**
     * 解析 transfer 回调数据
     *
     * @param params HTTP 回调接口 content type 为 application/x-www-form-urlencoded 的所有参数
     * @param body HTTP 回调接口的 request body
     * @param headers HTTP 回调接口的 request headers
     * @return 转账信息
     */
    UnifiedTransferVO parseTransferNotify(Map<String, String> params, String body, Map<String, String> headers);

}
